 package br.com.scp.facade;

import java.util.List;

import br.com.scp.controlador.ControladorCoordenador;
import br.com.scp.controlador.ControladorEvento;
import br.com.scp.controlador.ControladorParticipante;
import br.com.scp.controlador.ControladorParticipanteEvento;
import br.com.scp.controlador.IControladorCoordenador;
import br.com.scp.controlador.IControladorEvento;
import br.com.scp.controlador.IControladorParticipante;
import br.com.scp.controlador.IControladorParticipanteEvento;
import br.com.scp.exception.CelularNullException;
import br.com.scp.exception.CpfNullException;
import br.com.scp.exception.DescricaoNullException;
import br.com.scp.exception.DuracaoNullException;
import br.com.scp.exception.EmailNullException;
import br.com.scp.exception.EventoNullException;
import br.com.scp.exception.HorarioFimNullException;
import br.com.scp.exception.HorarioInicialNullException;
import br.com.scp.exception.HorarioNullException;
import br.com.scp.exception.LocalNullException;
import br.com.scp.exception.LoginNullException;
import br.com.scp.exception.MacNullException;
import br.com.scp.exception.MatriculaNullException;
import br.com.scp.exception.NomeNullException;
import br.com.scp.exception.ParticipanteEventoJaExiste;
import br.com.scp.exception.ParticipanteJaExiste;
import br.com.scp.exception.ParticipanteNullException;
import br.com.scp.exception.SenhaNullException;
import br.com.scp.exception.TelefoneNullException;
import br.com.scp.exception.TempoTotalNullException;
import br.com.scp.modelo.Coordenador;
import br.com.scp.modelo.Evento;
import br.com.scp.modelo.Participante;
import br.com.scp.modelo.ParticipanteEvento;

public class Fachada {
	
	private static Fachada instance;
	
	private IControladorCoordenador controladorCoordenador;
	private IControladorEvento controladorEvento;
	private IControladorParticipante controladorParticipante;
	private IControladorParticipanteEvento controladorParticipanteEvento;
	
	
	private Fachada() {
		controladorCoordenador = new ControladorCoordenador();
		controladorEvento = new ControladorEvento();
		controladorParticipante = new ControladorParticipante();
		controladorParticipanteEvento = new ControladorParticipanteEvento();
		
	}
	
	public static Fachada getInstance() {
		if(instance == null) {
			instance = new Fachada();
		}
		return instance;
	}
	
	//Coordenador
	public void salvarCoordenador(Coordenador coordenador) throws NomeNullException, EmailNullException, SenhaNullException, TelefoneNullException, LoginNullException{
		controladorCoordenador.salvar(coordenador);
	}
	public void atualizarCoordenador(Coordenador coordenador) throws NomeNullException, EmailNullException, SenhaNullException, TelefoneNullException, LoginNullException{
		controladorCoordenador.atualizar(coordenador);
	}
	public void inativarCoordenador(Coordenador coordenador){
		controladorCoordenador.inativar(coordenador);
	}
	public List<Coordenador> listarCoordenador(){
		return controladorCoordenador.List();
	}
	public List<Coordenador> listarCoordenadorQuery(String query){
		return controladorCoordenador.List(query);
	}
	public Coordenador logar(String login, String senha){
		return controladorCoordenador.logar(login, senha);
	}
	
	//Evento
	public void salvarEvento(Evento evento) throws NomeNullException, DescricaoNullException, DuracaoNullException, HorarioNullException, LocalNullException {
		controladorEvento.salvar(evento);
	}
	public void atualizarEvento(Evento evento) throws NomeNullException, DescricaoNullException, DuracaoNullException, HorarioNullException, LocalNullException {
		controladorEvento.atualizar(evento);
	}
	public void inativarEvento(Evento evento){
		controladorEvento.inativar(evento);
	}
	public List<Evento> listarEvento(){
		return controladorEvento.List();
	}
	public List<Evento> listarEventoQuery(String query){
		return controladorEvento.List(query);
	}
	
	//Participante
	public void salvarParticipante(Participante participante) throws NomeNullException, CelularNullException, CpfNullException, EmailNullException, MatriculaNullException, MacNullException, EventoNullException, ParticipanteJaExiste {
		controladorParticipante.salvar(participante);
	}
	public void atualizarParticipante(Participante participante) throws NomeNullException, CelularNullException, CpfNullException, EmailNullException, MatriculaNullException, MacNullException, EventoNullException  {
		controladorParticipante.atualizar(participante);
	}
	public void inativarParticipante(Participante participante){
		controladorParticipante.inativar(participante);
	}
	public List<Participante> listarParticipante(){
		return controladorParticipante.List();
	}
	public List<Participante> listarParticipanteQuery(String query){
		return controladorParticipante.List(query);
	}
	
	//ParticipanteEvento
		public void salvarParticipanteEvento(ParticipanteEvento participanteEvento) throws HorarioInicialNullException, HorarioFimNullException, EventoNullException, ParticipanteNullException, ParticipanteEventoJaExiste{
			controladorParticipanteEvento.salvar(participanteEvento);
		}
		public void atualizarParticipanteEvento(ParticipanteEvento participanteEvento) {
			controladorParticipanteEvento.atualizar(participanteEvento);
		}
		public void inativarParticipanteEvento(ParticipanteEvento participanteEvento){
			controladorParticipanteEvento.inativar(participanteEvento);
		}
		public List<ParticipanteEvento> listarParticipanteEvento(){
			return controladorParticipanteEvento.List();
		}
		public List<ParticipanteEvento> listarParticipanteEventoQuery(String query){
			return controladorParticipanteEvento.List(query);
		}
		
}
